import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt

# 绘图
# 线性图，一般用来查看趋势
s = Series(np.random.randint(0, 10, size=10))
# Series画图，以index作为x轴数据，values作为y轴数据
s.plot()
# pandas使用plot()函数实际上是使用matplotlib的包
data = np.random.randint(0, 150, size=(4, 4))
index = ['张三', '李四', '王五', '赵六']
columns = ['语文', '数学', '英语', 'python']
df = DataFrame(data, index, columns)
# DataFrame画图，以index作为x轴数据，每一列数据作为一条线
df.plot()
# 若有中文，会有警告，并且字体显示不出来，设置默认字体为中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
# 但中文字体下有负号,无法正常显示
df.index = [-1, -2, -3, -4]
# 解决中文字体下负号无法正常显示的问题
# 原因：中文中的-号会使用Unicode编码，
# 解决：不要让-号使用Unicode编码，设置中文字体和下面一行代码一般一起用
plt.rcParams['axes.unicode_minus'] = False
df.plot()
plt.show()

# 柱状图，一般用来比较大小
s.plot(kind='bar')  # 与线型图类似
df.index = ['张三', '李四', '王五', '赵六']
df.plot(kind='bar')  # 每一行数据放在一起比较大小
tips = pd.read_csv('./tips.csv', encoding='gbk').set_index(keys='day')
# DataFrame和Series运算，不能简单使用+ - * /
# 对应使用df.add() df.sub() df.mul() df.div()
tips = tips.div(tips.sum(axis=1), axis=0)
tips.plot(kind='bar')
plt.show()

# 直方图，一般用来表示数据的分布情况
n = np.array([1, 1, 2, 3, 4, 4, 5, 6, 6, 8])
s = Series(data=n)
s.plot(kind='hist', bins=100, density=True)
# bins分成100份，默认是10
# 加入density=True之后，y轴的值变成了概率/组距的结果
# 如果bins设置的不太合适，可以加上kde图来显示数据分布
s.plot(kind='kde')  # 核密度分布,一般使用需要和density=True一起使用
plt.show()

n1 = np.random.normal(loc=5, scale=5, size=10000)
n2 = np.random.normal(loc=30, scale=8, size=10000)
n = np.hstack((n1, n2))
s = Series(data=n)
s.plot(kind='hist', bins=500, density=True)
s.plot(kind='kde')
plt.show()

# 散点图，研究两个一维数据之间的关系，DataFrame对象可用
df = DataFrame(
    {'A': np.random.randn(1000), 'B': np.random.randn(1000), 'C': np.random.randn(1000), 'D': np.random.randn(1000)})

df.plot(x='A', y='B', kind='scatter')

x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
df2 = DataFrame({'x': x, 'y': y})
df2.plot(x='x', y='y', kind='scatter')
plt.show()

# 散点图矩阵，当有多个点，两两点的关系
# 使用函数：pd.plotting.scatter_matrix()
# 参数：
# figsize：画布大小
# alpha：透明度
# diagonal设置对角线的图像类型，对角线只有直方图（默认）和kde图

pd.plotting.scatter_matrix(df, figsize=(16, 16), alpha=0.6, diagonal='kde')
plt.show()
